package com.yanggu.spark.core.accumulator

import org.apache.spark.{SparkConf, SparkContext}

//累加器(分布式只写变量)。该变量在executor端使用时只能进行修改, 不能获取值。只有在driver端才能获取值
//spark中三大数据结构之一。另外两个是rdd和广播变量
//累加器用来把Executor端变量信息聚合到Driver端。在Driver程序中定义的变量，在Executor端的每个Task都会得到这个变量的一份新的副本，每个task更新这些副本的值后，传回Driver端进行merge。
object SystemAccumulator {

  def main(args: Array[String]): Unit = {

    //1. 创建sparkConf配置对象
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("spark")

    //2. 创建spark上下文对象
    val sparkContext = new SparkContext(sparkConf)

    //3. 从内存中创建RDD
    val value = sparkContext.makeRDD(List[Int](1, 2, 3, 4, 5))

    //4. 使用系统的累加器
    val sum = sparkContext.longAccumulator("sum")

    value.foreach(sum.add(_))

    //5. 打印
    println(sum.value)

    //6. 释放资源
    sparkContext.stop()
  }

}
